/*     Rechnung
 * 
 *     (i - (a+b) * (g+c)) / ( (h*e) + (f+j) * d)
 */

/*     Baumansicht
 *
 *                  (/)
 *                 /   \
 *               /       \
 *             /           \
 *           /               \
 *         /                   \
 *       (-)                    (+)
 *      /   \                  /   \
 *     /     \               /       \
 *    i      (*)           (*)       (*)
 *          /   \         /   \     /   \
 *       (+)     (+)     h     e  (+)    d
 *      /   \   /   \            /   \
 *     a     b g     c          f     j
 *
 */

/* LR Postorder Darstellung
 * (^ = pop, _ = push)
 * 
 * i_ab+_gc+^*^-_he*_fj+d*^+^/
 *
 */


.data
	a: .long 2
	b: .long 3
	c: .long 5
	d: .long 2
	e: .long 5
	f: .long 1
	g: .long 1
	h: .long 2
	i: .long 100
	j: .long 1

	str: .string "erg: %d\n"
.text
.global main
main:

// a + b
movl a, %eax
addl b, %eax
movl %eax, %ebx

// g + c
movl g, %eax
addl c, %eax

// (a+b) * (g+c)
cltd
imull %ebx
movl %eax, %ebx

// i - (a+b) * (g+c)
movl i, %eax
subl %ebx, %eax
// ergebnis der rechnung oberhalb des
// bruchstricks auf dem stack speichern
pushl %eax

// h * e
movl h, %eax
cltd
imull e, %eax
pushl %eax

// f + j
movl f, %eax
addl j, %eax

cltd
// (f+j) * d
imull d, %eax

// ((f+j)*d) + (h*e)
popl %ebx
addl %ebx, %eax

// unteres element in ebx speichern
movl %eax, %ebx
// oberes elenent in eax laden
popl %eax

cltd
// division des bruchs
idivl %ebx

pushl %eax
pushl $str
call printf
addl $8, %esp
movl $0x80, %eax
ret
